/**
 * Copyright &copy; 2013-2015 山东易科德软件有限公司   All rights reserved.
 */
package cn.net.ecode.modules.msg.util;

import java.util.Date;
import java.util.List;

import cn.net.ecode.common.persistence.Page;
import cn.net.ecode.common.utils.SpringContextHolder;
import cn.net.ecode.common.utils.StringUtils;
import cn.net.ecode.modules.msg.entity.Message;
import cn.net.ecode.modules.msg.entity.MessageRecord;
import cn.net.ecode.modules.msg.service.MessageService;
import cn.net.ecode.modules.sys.entity.Office;
import cn.net.ecode.modules.sys.entity.Post;
import cn.net.ecode.modules.sys.entity.Role;
import cn.net.ecode.modules.sys.entity.User;
import cn.net.ecode.modules.sys.service.PostService;
import cn.net.ecode.modules.sys.service.RoleService;
import cn.net.ecode.modules.sys.utils.UserUtils;

import com.google.common.collect.Lists;

/**
 * 消息工具类
 * @author ThinkGem
 * @version 2015-5-30
 */
public class MessageUtils {

	private static MessageService messageService = SpringContextHolder.getBean(MessageService.class);

	/**
	 * 发送消息（通知）
	 * @param contentTitle 消息标题
	 * @param contentText 消息内容
	 * @param receiverCodes 接受userCode，多个用英文逗号隔开
	 * @param receiverNames 接受userName，多个用英文逗号隔开（逗号个数必须与接受者相同）（为空，则自动获取userCode的名称）
	 * @param button 消息提醒按钮  String[] button = new String[]{"name", "href"}; String[][] buttons = new String[][]{button}（为空则没有按钮）
	 */
	public static void send(String contentTitle, String contentText, String receiverCodes, String receiverNames, String[][] buttons) {
		send(contentTitle, contentText, Message.RECEIVER_TYPE_USER, receiverCodes, receiverNames, buttons, Message.TYPE_NOTIFY);
	}

	/**
	 * 发送消息（通知）
	 * @param contentTitle 消息标题
	 * @param contentText 消息内容
	 * @param receiverCodes 接受officeCode，多个用英文逗号隔开
	 * @param receiverNames 接受officeName，多个用英文逗号隔开（逗号个数必须与接受者相同）（为空，则自动获取officeCode的名称）
	 * @param button 消息提醒按钮  String[] button = new String[]{"name", "href"}; String[][] buttons = new String[][]{button}（为空则没有按钮）
	 */
	public static void sendByOffice(String contentTitle, String contentText, String receiverCodes, String receiverNames, String[][] buttons) {
		send(contentTitle, contentText, Message.RECEIVER_TYPE_OFFICE, receiverCodes, receiverNames, buttons, Message.TYPE_NOTIFY);
	}

	/**
	 * 发送消息（短信）
	 * @param contentTitle 消息标题
	 * @param contentText 消息内容
	 * @param receiverType 接受者类型（Message.RECEIVER_***： 0未配置，设置什么使用什么（ 可为手机号、邮箱、微信 ） 1用户 2部门 3角色 4岗位  all_user所有用户 ）
	 * @param receiverCodes 接受者Code，多个用英文逗号隔开（根据消息类型设置，如果类型是用户，则填用户code，如果是手机，则填手机号，依次类推）
	 * @param receiverNames 接受者Name，多个用英文逗号隔开（逗号个数必须与接受者相同）（为空，则与receiverCodes相同）
	 */
	public static void sendSms(String contentTitle, String contentText, String receiverType, String receiverCodes, String receiverNames) {
		send(contentTitle, contentText, receiverType, receiverCodes, receiverNames, null, Message.TYPE_SMS);
	}

	/**
	 * 发送消息（邮件）
	 * @param contentTitle 消息标题
	 * @param contentText 消息内容
	 * @param receiverType 接受者类型（Message.RECEIVER_***：0未配置，设置什么使用什么（ 可为手机号、邮箱、微信 ） 1用户 2部门 3角色 4岗位  all_user所有用户 ）
	 * @param receiverCodes 接受者Code，多个用英文逗号隔开（根据消息类型设置，如果类型是用户，则填用户code，如果是手机，则填手机号，依次类推）
	 * @param receiverNames 接受者Name，多个用英文逗号隔开（逗号个数必须与接受者相同）（为空，则与receiverCodes相同）
	 */
	public static void sendEmail(String contentTitle, String contentText, String receiverType, String receiverCodes, String receiverNames) {
		send(contentTitle, contentText, receiverType, receiverCodes, receiverNames, null, Message.TYPE_EMAIL);
	}

	/**
	 * 发送消息（微信）
	 * @param contentTitle 消息标题
	 * @param contentText 消息内容
	 * @param receiverType 接受者类型（Message.RECEIVER_***：0未配置，设置什么使用什么（ 可为手机号、邮箱、微信 ） 1用户 2部门 3角色 4岗位  all_user所有用户 ）
	 * @param receiverCodes 接受者Code，多个用英文逗号隔开（根据消息类型设置，如果类型是用户，则填用户code，如果是手机，则填手机号，依次类推）
	 * @param receiverNames 接受者Name，多个用英文逗号隔开（逗号个数必须与接受者相同）（为空，则与receiverCodes相同）
	 */
	public static void sendWeixin(String contentTitle, String contentText, String receiverType, String receiverCodes, String receiverNames) {
		send(contentTitle, contentText, receiverType, receiverCodes, receiverNames, null, Message.TYPE_WEIXIN);
	}
	
	/**
	 * 发送消息
	 * @param contentTitle 消息标题
	 * @param contentText 消息内容
	 * @param receiverType 接受者类型（Message.RECEIVER_***：0未配置，设置什么使用什么（ 可为手机号、邮箱、微信 ） 1用户 2部门 3角色 4岗位  all_user所有用户 ）
	 * @param receiverCodes 接受者Code，多个用英文逗号隔开（根据消息类型设置，如果类型是用户，则填用户code，如果是部门，则填部门code，依次类推）
	 * @param receiverNames 接受者Name，多个用英文逗号隔开（逗号个数必须与接受者相同）（为空，则自动获取receiverCodes的名称）
	 * @param button 消息提醒按钮  String[] button = new String[]{"name", "href"}; String[][] buttons = new String[][]{button}（为空则没有按钮）
	 * @param type 消息类型（Message.TYPE_***：1通知 2消息 3短信 4邮件 5微信）
	 */
	public static void send(String contentTitle, String contentText, String receiverType,
			String receiverCodes, String receiverNames, String[][] buttons, String type) {
		Message message = new Message();
		message.setContentTitle(contentTitle);
		message.setContentText(contentText);
		message.setReceiverType(receiverType);
		message.setReceiverCodes(receiverCodes);
		message.setReceiverNames(receiverNames);
		if (buttons != null){
			for (String[] button : buttons){
				message.addButton(button);
			}
		}
		message.setType(type);
		send(message);
	}
	
	/**
	 * 立即发送消息，若想延迟发送，需指定发送时间（message.setSendDate(sendDate)，除内部消息类型外的其它消息类型有效）;
	 */
	public static void send(final Message message){
		// 线程发送，不影响主线程动作
		new Thread(new Runnable() {
			@Override
			public void run() {
				// 如果没设置内容标题，则获取前150个内容作为标题
				if (message.getContentTitle() == null){
					message.setContentTitle(StringUtils.abbr(message.getContentText(), 150));
				}
				// 如果没设置内容级别（默认：普通）
				if (message.getContentLevel() == null){
					message.setContentLevel("1"); 
				}
				// 如果没设置接受者类型（默认：用户类型）
				if (message.getReceiverType() == null){
					message.setReceiverType(Message.RECEIVER_TYPE_USER); 
				}
				// 接受者名称字符串（如果没有设置接受名称，则获取接受者名称）
				if (message.getReceiverCodes() != null && message.getReceiverNames() == null) {
					List<String> receiverNameList = Lists.newArrayList();
					// 根据接受者类型获取接受者名称
					switch (message.getReceiverType()) {
					case Message.RECEIVER_TYPE_USER:	// 用户
						for (String userCode : StringUtils.split(message.getReceiverCodes(), ",")) {
							String userName = "未知";
							User user = UserUtils.get(userCode);
							if (user != null && user.getUserCode() != null) {
								userName = user.getUserName();
							}
							receiverNameList.add(userName);
						}
						break;
					case Message.RECEIVER_TYPE_OFFICE:	// 部门
						List<Office> officeList = UserUtils.getOfficeAllList();
						for (String officeCode : StringUtils.split(message.getReceiverCodes(), ",")) {
							String officeName = "未知";
							for (Office office : officeList){
								if (officeCode.equals(office.getOfficeCode())){
									officeName = office.getOfficeName();
									break;
								}
							}
							receiverNameList.add(officeName);
						}
						break;
					case Message.RECEIVER_TYPE_ROLE:	// 角色
						RoleService roleService = SpringContextHolder.getBean(RoleService.class);
						List<Role> roleList = roleService.findList(new Role());
						for (String roleCode : StringUtils.split(message.getReceiverCodes(), ",")) {
							String roleName = "未知";
							for (Role role : roleList){
								if (roleCode.equals(role.getRoleCode())){
									roleName = role.getRoleName();
									break;
								}
							}
							receiverNameList.add(roleName);
						}
						break;
					case Message.RECEIVER_TYPE_POST:	// 岗位
						PostService postService = SpringContextHolder.getBean(PostService.class);
						List<Post> postList = postService.findList(new Post());
						for (String postCode : StringUtils.split(message.getReceiverCodes(), ",")) {
							String postName = "未知";
							for (Post post : postList){
								if (postCode.equals(post.getPostCode())){
									postName = post.getPostName();
									break;
								}
							}
							receiverNameList.add(postName);
						}
						break;
					}
					message.setReceiverNames(StringUtils.join(receiverNameList, ","));
				}
				messageService.save(message);
			}
		}).start();
	}
			

	/**
	 * 获得未接收消息列表
	 * @param receiver 接收人ID
	 */
	public static List<MessageRecord> getUndeliveredList(String receiver) {
		MessageRecord mr = new MessageRecord();
		mr.setReceiver(receiver);
		mr.setStatus(MessageRecord.STATUS_UNDELIVERED);
		return getMessageRecordList(mr);
	}

	/**
	 * 获得未读的消息列表
	 * @param receiver 接收人ID
	 */
	public static List<MessageRecord> getUnReadList(String receiver) {
		MessageRecord mr = new MessageRecord();
		mr.setReceiver(receiver);
		mr.setStatus(MessageRecord.STATUS_UNREAD);
		return getMessageRecordList(mr);
	}

	/** 
	 * 获取未读消息列表，可设置获取数量
	 * @param receiver 接收人
	 * @param number 获取数量
	 */
	public static List<MessageRecord> getUnReadList(String receiver, int number) {
		return getUnReadPage(receiver, number).getList();
	}

	/** 
	 * 获取未读消息总数 
	 * @param receiver
	 * @param number
	 */
	public static long getUnReadCount(String receiver, int number) {
		return getUnReadPage(receiver, number).getCount();
	}

	/** 
	 * 读取未读消息（分页读取） 
	 * @param receiver 接收人
	 * @param number 获取数量
	 */
	public static Page<MessageRecord> getUnReadPage(String receiver, int number) {
		Page<MessageRecord> page = new Page<MessageRecord>(1, number);
		MessageRecord mr = new MessageRecord();
		mr.setReceiver(receiver);
		mr.setStatus(MessageRecord.STATUS_UNREAD);
		page = messageService.findMessageRecordPage(page, mr);
		return page;
	}

	/**
	 * 获得消息记录
	 */
	public static List<MessageRecord> getMessageRecordList(MessageRecord mr) {
		return messageService.findMessageRecordList(mr);
	}

	/**
	 * 投递消息回调
	 * @param id
	 * @return
	 */
	public static boolean deliveredMsg(String id) {
		MessageRecord mr = new MessageRecord(id);
		mr.setReceiveDate(new Date());
		mr.setStatus(MessageRecord.STATUS_UNREAD);
		return messageService.updateMsgRecord(mr);
	}

	/**
	 * 读取消息回调
	 * @param id
	 * @return
	 */
	public static boolean readMsg(String id) {
		MessageRecord mr = new MessageRecord(id);
		mr.setReadDate(new Date());
		mr.setStatus(MessageRecord.STATUS_READ);
		return messageService.updateMsgRecord(mr);
	}

}